#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 查看现有的数据库驱动
    QStringList drivers = QSqlDatabase::drivers();  //获取现在可用的数据库驱动
    foreach(QString driver, drivers)
        qDebug() << driver;

    only_one_table_view = 0;
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_connect_clicked()
{
    // 链接数据库，数据库一般是远程连接的
    db = QSqlDatabase::addDatabase("QMYSQL");   // 加载 MySql 数据库驱动，可以用 QSQLITE
    db.setHostName("localhost");                // 数据库链接
    db.setPort(3306);                           // 链接端口
    db.setUserName("root");                     // 数据库用户名
    db.setPassword("不告诉你");                	// 数据库登录密码
    db.setDatabaseName("qt_test");              // 数据库名

    // 检查链接是否成功
    if (db.open())  // QSqlDatabase::open 函数返回 bool
    {
        QMessageBox::information(this, "链接提示", "数据库链接成功");
    }
    else
    {
        QMessageBox::warning(this, "警告", "链接数据库失败");
    }
}


void Widget::on_pushButton_insert_clicked()
{
    QString id = ui->id_lineEdit->text();
    QString name = ui->name_lineEdit->text();
    QString sex = ui->sex_lineEdit->text();
    QString age = ui->age_lineEdit->text();
    QString birthday = ui->birthday_lineEdit->text();

    // QString sql1 = QString("use qt_test;");
    QString sql2 = QString("insert into student values (NULL, '%2', '%3', '%4', '%5');").arg(name).arg(sex).arg(age).arg(birthday); // Qt 中 C++ 的字符串格式化方法

    QSqlQuery query;
    if (/*query.exec(sql1) && */query.exec(sql2))
    {
        QMessageBox :: information(this, "插入提示", "插入成功");
    }
    else
    {
        QMessageBox :: warning(this, "插入警告", "插入失败");
    }
    qDebug() << id.isEmpty();
}


void Widget::on_pushButton_select_clicked()
{
    QSqlQuery query;
    query.exec("select * from student"
               " where id < 3"
               " order by birthday desc;");   // 运行 SQL 语句
    // 上面句等同于下面注释的这句
    // QSqlQuery query("SELECT * FROM qt_test.student", db);
    // query.value() 返回 QVariant对象，用于存储各种数据

    QSqlRecord record = query.record();  // 记录数据库表等数据
    int record_count = record.count();   // 数据库表的列数

    while (query.next())    // 查询结果保存在 query 对象中，支持迭代器，迭代完成返回 false
    {
        for (int i = 0; i < record_count; ++i)
        {
            qDebug() << query.value(i);
        }
    }

    // 远程连接需要写一个连接函数，用于建立 SelectTableView 类的连接
    if (db.isOpen())
    {
        if (!only_one_table_view)
        {
            ++only_one_table_view;
            select_table_view = new SelectTableView(db);
            select_table_view->show();
        }
        else if (select_table_view->isHidden())
        {
            select_table_view->show();
        }
        else
        {
            QMessageBox::information(this, "提示", "窗口已打开");
        }
    }
    else
    {
        QMessageBox::warning(this, "警告", "数据库未连接");
    }
}

